﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using TSU.FAMC.ComputerEngineering.Classes.BooleanMaths.Functions.Readers;
using TSU.FAMC.ComputerEngineering.Classes.BooleanMaths.Functions;
using TSU.FAMC.ComputerEngineering.Classes.BooleanMaths.Functions.Writers;

namespace SystemMinimization
{
    public partial class MinimizationForm : Form
    {
        public static string OutputFolder { get; set; }

        public MinimizationForm()
        {
            InitializeComponent();
        }

        private void minimizeButton_Click(object sender, EventArgs e)
        {
            if (MinimizationForm.OutputFolder == string.Empty ||
                MinimizationForm.OutputFolder == null)
            {
                MessageBox.Show("Укажите директорию для результатов!");
                return;
            }

            if (openFileDlg.ShowDialog() != DialogResult.OK)
            {
                return;
            }

            if (openFileDlg.FileNames.Length == 0)
            {
                MessageBox.Show("Не выбрано ни одного файла для минимизации!");
                return;
            }

            // reading files
            reportBox.Clear();
            var errorsCounter = 0;
            foreach (var fileName in openFileDlg.FileNames)
            {
                var fileStr = String.Empty;

                try
                {
                    // reading file
                    var streamReader = new StreamReader(fileName);
                    fileStr = streamReader.ReadToEnd();
                }
                catch (Exception ex)
                {
                    reportBox.Text += string.Format("{0}. Ошибка: не удалось прочитать файл. Подрбнее: {1} \r\n\r\n", fileName, ex.Message);
                    errorsCounter++;
                    continue;
                }

                // reading system
                // replacing all '_' symbols within '-'
                fileStr = fileStr.Replace('_', '-');

                var reader = new BooleanSystemReaderPlafr();
                var system = new BooleanSystem();
                reader.System = system;
                reader.Input = fileStr;

                try
                {
                    reader.Read();
                }
                catch (Exception ex)
                {
                    reportBox.Text += string.Format("{0}. Ошибка: не удалось прочитать систему. Подрбнее: {1} \r\n\r\n", fileName, ex.Message);
                    errorsCounter++;
                    continue;
                }                

                // minimizing system
                var minimizedSystem = new BooleanSystem();
                try
                {
                    if (EachFunctionCheckBox.Checked)
                    {
                        minimizedSystem = system.MinimizeEach();
                    }
                    else
                    {
                        minimizedSystem = system.Minimize();
                    }
                }
                catch (Exception ex)
                {
                    reportBox.Text += string.Format("{0}. Ошибка: не удалось минимизировать систему. Подрбнее: {1} \r\n\r\n", fileName, ex.Message);
                    errorsCounter++;
                    continue;
                }

                // writing system
                var writer = new BooleanSystemWriterPlafd();
                writer.System = minimizedSystem;
                writer.Write();

                var systemStr = writer.Output;

                // saving to the file
                try
                {
                    var outputFilePath = MinimizationForm.OutputFolder + Path.DirectorySeparatorChar + Path.GetFileNameWithoutExtension(fileName);
                    if (EachFunctionCheckBox.Checked)
                    {
                        outputFilePath += "_min_each.pla";
                    }
                    else
                    {
                        outputFilePath += "_min.pla";
                    }

                    var streamWriter = new StreamWriter(outputFilePath);
                    streamWriter.Write(systemStr);
                    streamWriter.Close();
                }
                catch (Exception ex)
                {
                    reportBox.Text += string.Format("{0}. Ошибка: не удалось записать в файл. Подрбнее: {1} \r\n\r\n", fileName, ex.Message);
                    errorsCounter++;
                    continue;
                }

                reportBox.Text += string.Format("{0}. Успех: минимизация завершена успешно. \r\n\r\n", fileName);
            }

            if (errorsCounter == 0)
            {
                MessageBox.Show("Минимизация завершена успешно!");
            }
            else
            {
                MessageBox.Show(string.Format("Во время минимизации возникло {0} ошибок", errorsCounter));
            }
        }

        private void selectOutputButton_Click(object sender, EventArgs e)
        {
            if (folderBrowserDlg.ShowDialog() != DialogResult.OK)
            {
                return;
            }

            MinimizationForm.OutputFolder = folderBrowserDlg.SelectedPath;
            outputTextBox.Text = MinimizationForm.OutputFolder;
        }
    }
}
